/*
 * Copyright (c) 2012 SUBSECRETARIA DEFENSORIA DEL ESPACIO PUBLICO - SDEP.
 * All Rights Reserved.
 * This software is the confidential and proprietary information of SDEP
 * Developed By CONSTULT-SOFT S.A, Development Team 2012.
 *
 */
package co.gov.medellin.sdep.sisdep.domain.admin;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;

import co.gov.medellin.sdep.sisdep.admin.exception.SolicitudPermisoException;
import co.gov.medellin.sdep.sisdep.admin.exception.SolicitudPermisoRuntimeException;
import co.gov.medellin.sdep.sisdep.admin.service.ISolicitudPermisoService;
import co.gov.medellin.sdep.sisdep.common.AppConstants;
import co.gov.medellin.sdep.sisdep.domain.MessageModalWindowController;
import co.gov.medellin.sdep.sisdep.domain.SolicitudBaseController;
import co.gov.medellin.sdep.sisdep.domain.gestion.SolicitudController;
import co.gov.medellin.sdep.sisdep.gestion.exception.SolicitudException;
import co.gov.medellin.sdep.sisdep.model.SolicitudPermiso;
import co.gov.medellin.sdep.sisdep.regulacion.exception.SolicitudModificaException;

/**
 * @author acespedes
 * 
 */
public class SolicitudPermisoController extends SolicitudBaseController implements
		Serializable {

	/**
	 * generated serial version
	 */
	private static final long serialVersionUID = -3285110767384990403L;

	/**
	 * Constructor por defecto, inicializa los elemento basicos del Controlador
	 */
	public SolicitudPermisoController() {
		cleanValues();
	}

	/** bean para el manejo del formulario de busqueda SolicitudPermiso */
	private SolicitudPermiso solicitudPermisoSearch = new SolicitudPermiso();

	/** Objeto contenedor del listado de SolicitudPermiso luego de una consulta. */
	private DataModel solicitudPermisoListModel;

	/** bean para el manejo del formulario de creacion/edicion. SolicitudPermiso */
	private SolicitudPermiso solicitudPermiso = new SolicitudPermiso();

	/** instancia de servicio solicitudPermisoService */
	private ISolicitudPermisoService solicitudPermisoService;
	
	/** instancia del controller principal */
	private SolicitudController solicitudController;

	// --------------------------------------------------------------------
	// --- metodos para atender acciones init()
	// --------------------------------------------------------------------

	/**
	 * 
	 * @return String
	 * @throws SolicitudException 
	 * @throws SolicitudPermisoException 
	 * @throws SolicitudModificaException 
	 */
	public String initState() throws SolicitudException, SolicitudPermisoException {
		Map params = getExternalContext().getRequestParameterMap();
		Long solicitudId = new Long((String) params.get("solicitudId"));
		this.solicitudOrigenRedirectPage = (String) params.get("solicitudOrigenRedirectPage");
		this.solicitudDestinoRedirectPage = (String) params.get("solicitudDestinoRedirectPage");
		this.solicitud = getSolicitudService().get(solicitudId.longValue());
		this.solicitudPermiso = getSolicitudPermisoService().getSolicitudPermisoRelatedBy(solicitudId.longValue());
		if(this.solicitudPermiso == null){
			this.solicitudPermiso = new SolicitudPermiso();
			cleanValues();
			this.solicitudPermiso.setIdSolicitud(solicitudId);
			return solicitudOrigenRedirectPage;
		}
		return solicitudOrigenRedirectPage;
	}

	/**
	 * 
	 */
	public String manage() {
		String returnView = AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
		//this.solicitudPermiso.setIdSolicitud(this.solicitudController.getSolicitud().getId());
		//if(this.solicitudPermiso.getUsuarioModifica() == null) {
		if (this.solicitudPermiso.getId() == null) {
			returnView = create();
		} else {
			returnView = update();
		}
		if(this.solicitudDestinoRedirectPage != null){
			returnView = this.solicitudDestinoRedirectPage;
		}
		return returnView;
	}
	
	/**
	 * 
	 * @return String
	 */
	public String searchSolicitudPermisoByKey() {
		String msg = "";
		try {
			List valores = null;
			valores = getSolicitudPermisoService().load(1, 10,
					this.solicitudPermisoSearch);
			this.solicitudPermisoListModel.setWrappedData(valores);
		} catch (Exception e) {
			msg = e.getMessage();
			e.printStackTrace(System.err);
		}
		if (this.solicitudPermisoListModel.getWrappedData() == null) {
			if(msg.equals("")){
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		} else {
			if (((List) this.solicitudPermisoListModel.getWrappedData()).isEmpty()) {
				msg = AppConstants.NO_RECORDS_FOUND;
			}
		}
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage(msg, null, null);
		return AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String create() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudPermiso.getId() == null) {
				
				if(!this.solicitudPermiso.getContravencion().equalsIgnoreCase("N") ){
					this.solicitudPermiso.setIdContravencion(new Long(this.solicitudPermiso.getIdContravencionStr()));
				}
				
				getSolicitudPermisoService().insert(this.solicitudPermiso);
				msg = AppConstants.SUCCESS_CREATE;
			}
		} catch (SolicitudPermisoException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudPermisoRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Solicitud Permiso " + msg, null, null);
		return this.solicitudDestinoRedirectPage;
	}

	/**
	 * 
	 * @return
	 */
	public String update() {
		String msg = AppConstants.DEFAULT_ERROR;
		try {
			if (this.solicitudPermiso.getId() != null) {
				
				if(!this.solicitudPermiso.getContravencion().equalsIgnoreCase("N") ){
					this.solicitudPermiso.setIdContravencion(new Long(this.solicitudPermiso.getIdContravencionStr()));
				}else{
					this.solicitudPermiso.setIdContravencion(null);
				}
				getSolicitudPermisoService().update(this.solicitudPermiso);
				msg = AppConstants.SUCCESS_UPDATE;
			}
		} catch (SolicitudPermisoException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		} catch (SolicitudPermisoRuntimeException e) {
			msg = e.getEndUserMessage();
			e.printStackTrace(System.err);
		}
		cleanValues();
		((MessageModalWindowController) getBean("messageController"))
				.setSuccessMessage("- Solicitud Permiso " + msg, null, null);
		return this.solicitudDestinoRedirectPage;
	}

	// --------------------------------------------------------------------
	// --- metodos para atender acciones end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public String createSolicitudPermiso() {
		solicitudPermiso = new SolicitudPermiso();
		cleanValues();
		this.solicitudDestinoRedirectPage = AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
		return AppConstants.SOLICITUD_PERMISO_CREATE_VIEW;
	}

	/**
	 * 
	 * @return
	 */
	public String updateSolicitudPermiso() {
		Map params = getExternalContext().getRequestParameterMap();
		String solicitudPermisoDataIndex = (String) params
				.get("solicitudPermisoDataIndex");
		this.solicitudPermiso = (SolicitudPermiso) ((List) this.solicitudPermisoListModel
				.getWrappedData())
				.get(Integer.parseInt(solicitudPermisoDataIndex));
		cleanValues();
		this.solicitudDestinoRedirectPage = AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
		return AppConstants.SOLICITUD_PERMISO_UPDATE_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelSolicitudPermiso() {
		cleanValues();
		return AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
	}

	/**
	 *
	 * @return
	 */
	public String cancelSolicitudPermisoOpcion() {
		cleanValues();
		return AppConstants.SOLICITUD_PERMISO_SEARCH_VIEW;
	}


	/**
	 * limpia el contenido de los valores que se ingresan (Create, Update)
	 */
	public final void cleanValues(){
		solicitudPermiso.setId(null);
		solicitudPermiso.setIdSolicitud(null);
		solicitudPermiso.setNumeroPermiso(null);
		solicitudPermiso.setIdContravencion(null);
		solicitudPermiso.setContravencion("N");
		solicitudPermiso.setFechaInicio(null);
		solicitudPermiso.setFechaFin(null);
		solicitudPermiso.setEstado("");
		this.solicitudPermisoListModel = new ListDataModel();
	}

	// --------------------------------------------------------------------
	// --- metodos para atender reglas de navegacion end()
	// --------------------------------------------------------------------

	// --------------------------------------------------------------------
	// --- getters and setters init()
	// --------------------------------------------------------------------

	/**
	 * 
	 */
	public SolicitudPermiso getSolicitudPermisoSearch() {
		return solicitudPermisoSearch;
	}

	/**
	 * 
	 * @param solicitudPermisoSearch
	 */
	public void setsolicitudPermisoSearch(SolicitudPermiso solicitudPermisoSearch) {
		this.solicitudPermisoSearch = solicitudPermisoSearch;
	}

	/**
	 * 
	 * @return
	 */
	public DataModel getsolicitudPermisoListModel() {
		return solicitudPermisoListModel;
	}

	/**
	 * 
	 * @param solicitudPermisoListModel
	 */
	public void setsolicitudPermisoListModel(DataModel solicitudPermisoListModel) {
		this.solicitudPermisoListModel = solicitudPermisoListModel;
	}

	/**
	 * 
	 * @return
	 */
	public SolicitudPermiso getSolicitudPermiso() {
		return solicitudPermiso;
	}

	/**
	 * 
	 * @param solicitudPermiso
	 */
	public void setsolicitudPermiso(SolicitudPermiso solicitudPermiso) {
		this.solicitudPermiso = solicitudPermiso;
	}

	/**
	 * obtencion del servicio solicitudPermisoService
	 * 
	 * @return
	 */
	public ISolicitudPermisoService getSolicitudPermisoService() {
		return solicitudPermisoService;
	}

	/**
	 * establecimiento del servicio solicitudPermisoService, la inyeccion de la
	 * dependencia la cubre SpringFramework
	 * 
	 * @param solicitudPermisoService
	 */
	public void setSolicitudPermisoService(
			ISolicitudPermisoService solicitudPermisoService) {
		this.solicitudPermisoService = solicitudPermisoService;
	}

	/**
	 * @param solicitudController the solicitudController to set
	 */
	public void setSolicitudController(SolicitudController solicitudController) {
		this.solicitudController = solicitudController;
	}

	/**
	 * @return the solicitudController
	 */
	public SolicitudController getSolicitudController() {
		return solicitudController;
	}

	// --------------------------------------------------------------------
	// --- getters and setters end()
	// --------------------------------------------------------------------

}
